import { 
     SET_TOKEN,
     SET_URSER_INFO,
     CLEAR_COMMON_STATE, 
     SET_MENULIST, 
     SET_ROLELIST 
    } from '../action/types'
import { AES,enc } from 'crypto-js'

//定义一个密钥
const KEY = 'doc-app-keys'

//页面刷新以后不会进入reducer文件？会
//所以页面的数据会被重置initState
// 当页面进入的时候，读取缓存
let cache = sessionStorage.getItem('redux')

if(!cache) {
    cache = {}
} else {
    // 解密
    let newCache = AES.decrypt(cache,KEY).toString(enc.Utf8)
    cache = JSON.parse(newCache)
}

const initState = {
    token:cache.token || '',//票据
    userInfo:cache.userInfo || {},//用户信息
    menuList:cache.menuList || [],//菜单
    roleList:cache.roleList || []//权限
}

const makeState = function(myState) {
    //加密
    let session = AES.encrypt(JSON.stringify(myState),KEY).toString()
    sessionStorage.setItem('redux',session)
    return myState
}

// const makeState = myState =>{
//     let session = AES.encrypt(JSON.stringify(myState),KEY).toString()
//     sessionStorage.setItem('redux',session)
//     return myState
// }

 const reducer = (state = initState,action) =>{
    //  let myState,session
     switch (action.type) {
        case SET_TOKEN:
            //如果在一个代码块中出现多次对同一个变量定义
            // myState = {
            //     ...state,
            //     token: action.token
            // }
            // makeState(myState)
            // return myState

            // myState = {
            //     ...state,
            //     token: action.token
            // }
            // return makeState(myState)
            

            //return 的方法，是要求你一个方法执行完成以后的结果
            // 如果makeState方法会返回一个数据，直接写成return makeState方法
            return makeState({...state,token:action.token})//票据
        case SET_URSER_INFO:
            // myState = {
            //     ...state,
            //     userInfo:action.userInfo
            // }
            // session = AES.encrypt(JSON.stringify(myState),KEY).toString
            // sessionStorage.setItem('redux',session)
            // return myState

            return makeState({...state,userInfo:action.userInfo})//用户信息
        case SET_MENULIST:
            return makeState({...state,menuList:action.menuList})//菜单
        case CLEAR_COMMON_STATE:
            sessionStorage.removeItem('redux')
            return {
                token:'',//票据
                userInfo:{},//用户信息
                menuList:[],//菜单
                rightList:[]//权限
            }//对本地数据进行清空
        case SET_ROLELIST:
                return makeState({...state,roleList:action.roleList})//权限
        default:
            return JSON.parse(JSON.stringify(initState))
     }
 }

 export default reducer